<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <!-- 
        深度优先遍历算法口诀：
        - 访问根节点
        - 对根节点的没访问过的相邻节点挨个进行深度优先遍历
     -->
</head>
<body>
    <script>
        // 以邻接表的形式存储
        const graph = {
            0: [1, 2],
            1: [2],
            2: [0, 3],
            3: [3]
        };

        const visited = new Set(); // 记录已经访问过的节点
        const dfs = (n) => {
            console.log(n); // 访问节点
            visited.add(n); // 把该节点添加到访问节点集合中
            graph[n].forEach(c => { // 遍历该节点的相邻节点
                if (!visited.has(c)) { // 把相邻节点中未访问的节点进行深度优先遍历
                    dfs(c);
                }
            })
        }
        dfs(2); // 把2作为根节点进行深度优先遍历
        // 输出2 0 1 3
    </script>
</body>
</html>